 /*******************************************************************************
  * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/

 package org.eclipse.osgi.baseadaptor.loader;

 import java.net.URL ;
 import java.security.ProtectionDomain ;
 import org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry;
 import org.eclipse.osgi.baseadaptor.bundlefile.BundleFile;
 import org.eclipse.osgi.framework.adaptor.BundleClassLoader;

 /**
  * The actual class loader object used to define classes for a classpath manager.
  * This interface provides public versions of a few methods on class loader.
  * @see ClasspathManager
  * @since 3.2
  */
 public interface BaseClassLoader extends BundleClassLoader {
     /**
      * Returns the domain for the host bundle of this class loader
      * @return the domain for the host bundle of this class loader
      */
     ProtectionDomain getDomain();

     /**
      * Creates a classpath entry with the given bundle file and domain
      * @param bundlefile the source bundle file for a classpath entry
      * @param cpDomain the source domain for a classpath entry
      * @return a classpath entry with the given bundle file and domain
      */
     ClasspathEntry createClassPathEntry(BundleFile bundlefile, ProtectionDomain cpDomain);

     /**
      * Defines a Class.
      * @param name the name of the class to define
      * @param classbytes the bytes of the class to define
      * @param classpathEntry the classpath entry used to load the class bytes
      * @param entry the bundle entry used to load the class bytes
      * @return a defined Class
      */
     Class defineClass(String name, byte[] classbytes, ClasspathEntry classpathEntry, BundleEntry entry);

     /**
      * A public version of the {@link ClassLoader#findLoadedClass(java.lang.String)} method.
      * @param classname the class name to find.
      * @return a loaded class
      */
     Class publicFindLoaded(String classname);

     /**
      * A public version of the {@link ClassLoader#getPackage(java.lang.String)} method.
      * @param pkgname the package name to get.
      * @return the package or null if it does not exist
      */
     Object publicGetPackage(String pkgname);

     /**
      * A public version of the {@link ClassLoader#definePackage(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.net.URL)} method.
      * @return a defined Package
      */
     Object publicDefinePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase);

     /**
      * Returns the ClasspathManager for this BaseClassLoader
      * @return the ClasspathManager
      */
     ClasspathManager getClasspathManager();
 }

